package com.zjsru.plan2023.oneday.oneDay202301;

/**
 * @Author: CookLee
 * @Date: 2023/1/29
 * 统计星号
 * 给你一个字符串 s ，每 两个 连续竖线 '|' 为 一对 。换言之，第一个和第二个 '|' 为一对，第三个和第四个 '|' 为一对，以此类推。
 *
 * 请你返回 不在 竖线对之间，s 中 '*' 的数目。
 *
 * 输入：s = "l|*e*et|c**o|*de|"
 * 输出：2
 * 解释：不在竖线对之间的字符加粗加斜体后，得到字符串："l|*e*et|c**o|*de|" 。
 * 第一和第二条竖线 '|' 之间的字符不计入答案。
 * 同时，第三条和第四条竖线 '|' 之间的字符也不计入答案。
 * 不在竖线对之间总共有 2 个星号，所以我们返回 2 。
 *
 * 输入：s = "yo|uar|e**|b|e***au|tifu|l"
 * 输出：5
 * 解释：需要考虑的字符加粗加斜体后："yo|uar|e**|b|e***au|tifu|l" 。不在竖线对之间总共有 5 个星号。所以我们返回 5 。
 */
public class CountAsterisks {
    
    private static final String SPECIAL_STAR     = "*";
    
    private static final String SPECIAL_VERTICAL = "\\|";
    
    /**
     * 计数星号:模拟 按照符号| 分割，由于题目特性只考虑偶数位的字符串即可（包括第0位）
     *
     * @param s 字符串
     * @return int
     */
    public int countAsterisks(String s) {
        String[] split = s.split(SPECIAL_VERTICAL);
        int ans = 0;
        for (int i = 0; i < split.length; i++) {
            if ((i & 1) == 0 && split[i].contains(SPECIAL_STAR)) {
                Integer num = this.helper(split[i]);
                ans += num;
            }
        }
        return ans;
    }
    
    /**
     * 统计星数助手类
     *
     * @param s 年代
     * @return {@link Integer}
     */
    private Integer helper(String s) {
        int ans = 0;
        for (int i = 0; i < s.length(); i++) {
            if (SPECIAL_STAR.equals(String.valueOf(s.charAt(i)))) {
                ans++;
            }
        }
        return ans;
    }
    
    /**
     * 模拟：减少循环，对于先碰到|后跳过，遇到下一个|再次扭转状态
     *
     * @param s 字符串
     * @return int
     */
    public int countAsterisks2(String s) {
        boolean valid = true;
        int res = 0;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '|') {
                valid = !valid;
            } else if (c == '*' && valid) {
                res++;
            }
        }
        return res;
    }
    
    
    public static void main(String[] args) {
        CountAsterisks countAsterisks = new CountAsterisks();
        String s = "yo|uar|e**|b|e***au|tifu|l";
        System.out.println(countAsterisks.countAsterisks(s));
    }
}
